<script setup>
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
import { getLoginInfoStorageSync } from '@/utils/storageSync'

/**
 * 路由配置
 */
const routeConfig = {
  // 白名单路由(无需登录可访问)
  whiteList: ['pages/login/index'],
  // tabBar页面
  tabBarPages: ['pages/index/index'],
  // 登录页路径
  loginPage: '/pages/login/index'
}

/**
 * 路由权限检查
 * @param {string} url 目标路由地址
 * @returns {boolean} 是否有权限访问
 */
const checkRoutePermission = (url) => {
  // 获取不带参数的路径
  const path = url.startsWith('/') ? url.substr(1) : url
  const { token } = getLoginInfoStorageSync()

  // 已登录状态下访问登录页，重定向到首页
  if (token && path === 'pages/login/index') {
    uni.reLaunch({ url: '/pages/index/index' })
    return false
  }

  // 未登录处理
  if (!token) {
    // tabBar页面使用reLaunch跳转
    if (routeConfig.tabBarPages.includes(path)) {
      uni.reLaunch({ url: routeConfig.loginPage })
      return false
    }

    // 非白名单页面使用navigateTo跳转
    if (!routeConfig.whiteList.includes(path)) {
      uni.navigateTo({ url: routeConfig.loginPage })
      return false
    }
  }

  return true
}

/**
 * 检查当前页面登录状态
 */
const checkLoginStatus = () => {
  const { token } = getLoginInfoStorageSync()
  const pages = getCurrentPages()
  const currentPage = pages[pages.length - 1]
  const currentPath = currentPage?.route || ''

  // 已登录状态下在登录页，重定向到首页
  if (token && currentPath === 'pages/login/index') {
    uni.reLaunch({ url: '/pages/index/index' })
    return false
  }

  if (!token) {
    // 当前页面是tabBar或非白名单页面时跳转登录
    if (routeConfig.tabBarPages.includes(currentPath) || (currentPath && !routeConfig.whiteList.includes(currentPath))) {
      uni.reLaunch({ url: routeConfig.loginPage })
      return false
    }
  }
  return true
}

// 应用生命周期
onLaunch(() => {
  console.log('App Launch')
  // 首次启动检查登录状态
  if (!getLoginInfoStorageSync().token) {
    uni.reLaunch({ url: routeConfig.loginPage })
  }
})

onShow(() => {
  console.log('App Show')
  checkLoginStatus()
})

onHide(() => {
  console.log('App Hide')
})

// 路由拦截器
const interceptors = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
interceptors.forEach((method) => {
  uni.addInterceptor(method, {
    invoke(e) {
      console.log(method, e)
      return checkRoutePermission(e.url.split('?')[0])
    }
  })
})
</script>

<style>
page {
  background-color: #fafafa;
}
</style>
